package com.sanmu.sanmuapplicationContext;

import com.sanmu.bean.Monster;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 这个程序用于实现Spring的一个简单容器机制
 * 后面我们会详细的实现
 * 这里主要是我们实现如何beans.xml文件进行解析，并生成对象，放入容器中
 * 提供一个方法getBean（id)返回对应的对象
 * 这里是理解Spring容器机制
 */
public class SmuApplicationContext {
    private ConcurrentHashMap<String, Object> singletonObjects = new ConcurrentHashMap<>();

    //构造器
    //1.接受一个容器的配置文件 比如beans.xml，该文件默认在src
    public SmuApplicationContext(String iocBeanXmlFile) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        //得到类的加载路径
        String path = this.getClass().getResource("/").getPath();
        //创建Saxreder
        SAXReader saxReader = new SAXReader();

        //获得Document对象
        Document document = saxReader.read(new File(path + iocBeanXmlFile));
        //得到rootDocument
        Element rootElement = document.getRootElement();

        //得到第一个bean-monster01
        Element bean = (Element) rootElement.elements("bean").get(0);

        //获取到第一个bean-monster01的相关属性
        String id = bean.attributeValue("id");
        String classFullPath = bean.attributeValue("class");
       // System.out.println("id: " + id + "\n" + "classFullPath: " + classFullPath);

        List<Element> property = bean.elements("property");
        //遍历
       Integer monsterId = Integer.parseInt(property.get(0).attributeValue("value"));
       String name = property.get(1).attributeValue("value");
       String sKill = property.get(2).attributeValue("value");

        //使用反射创建对象
        Class<?> aclass = Class.forName(classFullPath);
        Monster o = (Monster)aclass.newInstance();
        o.setMonsterId(monsterId);
        o.setsKill(sKill);
        o.setName(name);
        singletonObjects.put(id,o);

    }
    public Object getBean(String id){
        return singletonObjects.get(id);
    }

}
